package providers

import (
	"strings"
	"time"

	"github.com/go-redis/redis"
)

const cRedisHeartbeat = 60 // 单位 ： 秒
var Redis *redis.Client

func init() {
	if !Config.GetBool("redis.isStart") {
		return
	}

	Redis = getRedisClient()

	if _, err := Redis.Ping().Result(); err != nil {
		panic("redis初始化打开失败:" + err.Error())
	}

	// 简单的定时任务
	go redisHeartbeatRun()
}

/**
 * 获取 redis 客户端
 */
func getRedisClient() *redis.Client {
	redisConfig := Config.GetStringMap("redis")

	return redis.NewClient(&redis.Options{
		Addr:     redisConfig["host"].(string),
		Password: redisConfig["password"].(string), // no password set
		DB:       int(redisConfig["db"].(int64)),   // use default DB
	})
}

/**
 * 重置 redis 客户端
 */
func resetRedis() {
	// 关闭原有的 redis 连接
	if Redis != nil {
		Redis.Close()
	}

	Redis = getRedisClient()

	if _, err := Redis.Ping().Result(); err != nil {
		Logger.Errorf("redis初始化打开失败:%s", err.Error())
	}
}

/**
 * 心跳
 */
func redisHeartbeatRun() {
	timer := time.NewTicker(cRedisHeartbeat * time.Second)
	for {
		select {
		case <-timer.C: // 每一分钟 ping 一次
			if pong, err := Redis.Ping().Result(); err != nil || strings.ToLower(pong) != "pong" {
				resetRedis()
				Logger.Errorf("心跳检测 redis 客户端有误:%+v;pong:%s", err, pong)
			}
		}
	}
}
